package cn.stylefeng.guns.modular.gridsystem.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.guns.core.context.login.LoginContextHolder;
import cn.stylefeng.guns.core.exception.ServiceException;
import cn.stylefeng.guns.core.factory.PageFactory;
import cn.stylefeng.guns.core.pojo.page.PageResult;
import cn.stylefeng.guns.modular.gridsystem.entity.BizAmpLog;
import cn.stylefeng.guns.modular.gridsystem.enums.LogExceptionEnum;
import cn.stylefeng.guns.modular.gridsystem.enums.SystemParamExceptionEnum;
import cn.stylefeng.guns.modular.gridsystem.mapper.BizAmpLogMapper;
import cn.stylefeng.guns.modular.gridsystem.model.param.BizAmpLogParam;
import cn.stylefeng.guns.modular.gridsystem.model.result.BizAmpLogResult;
import cn.stylefeng.guns.modular.gridsystem.service.BizAmpLogService;
import cn.stylefeng.guns.modular.gridsystem.utils.OptionalBean;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * 振动数据上报日志 服务实现类
 *
 * @author ssy
 * @date 2023/02/03 09:53
 */
@Service
public class BizAmpLogServiceImpl extends ServiceImpl<BizAmpLogMapper, BizAmpLog> implements BizAmpLogService {

    /**
     * 分页查询震动数据日志
     *
     * @param bizAmpLogParam 查询条件入参
     *                       gatewayIds  网关id数组
     *                       gatewayCode 网关编号
     *                       channel     通道
     * @return Page<BizAmpLogResult>
     */
    @Override
    public PageResult<BizAmpLogResult> page(BizAmpLogParam bizAmpLogParam) {
        if (StrUtil.isNotEmpty(bizAmpLogParam.getGatewayIds())) {
            List<String> gatewayIds = Arrays.asList(bizAmpLogParam.getGatewayIds().split(","));
            bizAmpLogParam.setGatewayIdList(gatewayIds);
        }
        Page<BizAmpLogResult> bizAmpLogResultPage = baseMapper.page(PageFactory.defaultPage(), bizAmpLogParam);
        return new PageResult<>(bizAmpLogResultPage);
    }

    /**
     * 添加振动数据上报日志
     *
     * @param bizAmpLogParam 新增数据入参
     *                       vibrationPoint     网关id数组
     *                       fileId             网关编号
     *                       channel            通道
     *                       gatewayCode        网关编号
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void add(BizAmpLogParam bizAmpLogParam) {
        // 将dto转为实体
        BizAmpLog bizAmpLog = new BizAmpLog();
        BeanUtil.copyProperties(bizAmpLogParam, bizAmpLog);
        bizAmpLog.setCreateUser(LoginContextHolder.me().getSysLoginUser().getId());
        bizAmpLog.setCreateTime(new Date());
        save(bizAmpLog);
    }

    /**
     * 根据id删除震动数据日志
     *
     * @param bizAmpLogParam 删除入参
     *                       id     主键id
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delete(BizAmpLogParam bizAmpLogParam) {
        removeById(bizAmpLogParam.getId());
    }

    /**
     * 修改振动数据上报日志信息
     *
     * @param bizAmpLogParam 修改日志信息入参
     *                       id                 主键id
     *                       vibrationPoint     网关id数组
     *                       fileId             网关编号
     *                       channel            通道
     *                       gatewayCode        网关编号
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void edit(BizAmpLogParam bizAmpLogParam) {
        BizAmpLog bizAmpLog = new BizAmpLog();
        BeanUtil.copyProperties(bizAmpLogParam, bizAmpLog);
        bizAmpLog.setUpdateUser(LoginContextHolder.me().getSysLoginUser().getId());
        bizAmpLog.setUpdateTime(new Date());
        updateById(bizAmpLog);
    }

    /**
     * 查看详情振动数据上报日志
     *
     * @param bizAmpLogParam 查询入参
     *                       id      主键id
     * @return BizAmpLogResult
     */
    @Override
    public BizAmpLogResult detail(BizAmpLogParam bizAmpLogParam) {
        return queryBizAmpLog(bizAmpLogParam);
    }


    /**
     * 根据id查询震动数据上传日志
     *
     * @param bizAmpLogParam 查询入参
     *                       id      主键id
     * @return BizAmpLogResult
     */
    private BizAmpLogResult queryBizAmpLog(BizAmpLogParam bizAmpLogParam) {
        OptionalBean.ofNullable(bizAmpLogParam).orElseThrow(() -> new ServiceException(SystemParamExceptionEnum.PARAM_NULL_ERROR));
        OptionalBean.ofStr(bizAmpLogParam.getId());
        BizAmpLog bizAmpLog = getById(bizAmpLogParam.getId());
        OptionalBean.ofNullable(bizAmpLog).orElseThrow(() -> new ServiceException(LogExceptionEnum.NOT_EXISTED));
        BizAmpLogResult bizAmpLogResult = new BizAmpLogResult();
        BeanUtil.copyProperties(bizAmpLog, bizAmpLogResult);
        return bizAmpLogResult;
    }
}
